﻿#pragma once

#include <QString>
#include <QVariantMap>
#include "ADFGlobal.h"

#define DB_DECLARE_FIELD(_var) registerField(&_var,#_var);
#define DB_DECLARE_TABLE_NAME(_name) virtual QString tableName()override{return #_name;}
#define DB_DECLARE_PRIMARY_KEY(_key) virtual QString primaryKeyName()override{return #_key;}

using Pair_Type_DataPtr = std::pair<int, void*>;

class ADF_EXPORT AsDbEntity {
public:
	virtual ~AsDbEntity();

public:
	//表格名称,用户实现
	virtual QString tableName() { return "empty_table"; }
	//主键字段，用户实现，默认为"id"
	virtual QString primaryKey() { return "id"; }

	QVariant getPrimaryValue();

	void fromVariantMap(const QVariantMap& dataMap);

	QVariantMap toVariantMap();

protected:
	//tips: 使用时需要实现此函数，完成数据类型注册
	//eg: DB_DECLARE_FIELD(id);
	virtual void onBuildStruct() = 0;			

protected:
	/**
	 * 字段注册
	 */
	template<typename _TYPE>
	void registerField(_TYPE* data, QString keyName) {
		m_mapTypeData[keyName] = Pair_Type_DataPtr(qMetaTypeId<_TYPE>(), data);
	}

private:
	QMap<QString, Pair_Type_DataPtr> m_mapTypeData;
};
